package me.keiwu.user.job;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import me.keiwu.pub.data.ResponseV2;
import me.keiwu.pub.data.enums.NoticeType;
import me.keiwu.pub.data.service.UserInfoBean;
import me.keiwu.pub.service.WXService;
import me.keiwu.pub.util.CacheUtil;
import me.keiwu.pub.util.DateUtil;
import me.keiwu.user.domain.Notice;
import me.keiwu.user.domain.User;
import me.keiwu.user.domain.UserForm;
import me.keiwu.user.rpc.ChallengeRpc;
import me.keiwu.user.service.NoticeService;
import me.keiwu.user.service.UserService;
import me.keiwu.user.util.ExceptionUtil;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.http.HttpStatus;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by Anthony on 23/03/2018.
 */
@Component
public class UserJob {
//    private static final Logger logger = LoggerFactory.getLogger(UserJob.class);
//
//    @Autowired
//    private CacheUtil cacheUtil;
//    @Autowired
//    private UserService userService;
//    @Autowired
//    private WXService wxService;
//    @Autowired
//    private NoticeService noticeService;
//    @Autowired
//    private ChallengeRpc challengeRpc;
//    @Autowired
//    private ExceptionUtil exceptionUtil;
    /**
     *
     * 对5天未上线的用户发消息
     *
     */
//    @Scheduled(cron = "0 40 16 * * ?")
//    @Scheduled(cron = "0 0 22 * * ?")
//    public void runLoginHint(){
//        logger.info("****** runLoginHint start ******");
//        List<User> inactiveUserList = userService.getInactiveUser();
//        if (inactiveUserList == null || inactiveUserList.size() == 0){
//            logger.info("runLoginHint:No inactive user!");
//        }
//        for (User user : inactiveUserList ){
//            if (user != null){
//                UserForm userForm = userService.getOldestUserFormById(user.getId());
//                if (userForm != null){
//                    Map<String, Object> map = new HashMap<String, Object>();
//                    map.put("formId", userForm.getFormId());
//                    map.put("templateMsgType",2);
//                    ResponseV2 resp = wxService.sendTemplateMsg(null,JSONObject.toJSONString(user),"pages/home/home",map);
//                    if(resp.getCode() == HttpStatus.OK.value()) {
//                        userService.deleteUsedForm(userForm.getId());
//                    }else {
//                        this.exceptionLog(resp.getMsg());
//                    }
//                }
//            }
//        }
//        logger.info("****** runLoginHint end ******");
//    }

    /**
     *
     * 14点发送第一波挑战推送
     *
     */
//    @Scheduled(cron = "0 0 14 * * ?")
//    public void challengeInviteNoticeFirstJob() {
//        logger.info("challengeInviteNoticeJob at 1:00 ...");
//        sendChallengeInviteNotice();
//    }

    /**
     *
     * 18点发送第二波挑战推送
     *
     */
//    @Scheduled(cron = "0 0 18 * * ?")
//    public void challengeInviteNoticeSecondJob() {
//        logger.info("challengeInviteNoticeJob at 18:00 ...");
//        sendChallengeInviteNotice();
//    }

//    private void sendChallengeInviteNotice() {
//        int page = 0;
//        int size = 10;
//        while (true) {
//            Page<Notice> notices = noticeService.unreadChallengeNoticeList(page,size);
//            for (Notice obj : notices) {
//                try {
//                    Long challengeId = Long.parseLong(obj.getUniqueKey());
//                    Long noticeFromId = obj.getFromUser();
//                    Long noticeToId = obj.getToUser();
//                    String challengeStr = challengeRpc.findAllUserChallenge(challengeId);
//                    if (StringUtils.isEmpty(challengeStr)) {
//                        this.exceptionLog("challenge not found!");
//                        continue;
//                    }
//
//
//                    JSONObject challengeJson = JSON.parseObject(challengeStr);
//                    int challengeStatus = challengeJson.getIntValue("state");
//                    if (challengeStatus != 0) {
//                        continue;
//                    }
//                    Long challengeInvitorId = challengeJson.getLong("initiator");
//                    Long toUserId = null;
//                    if (challengeInvitorId.equals(noticeFromId)) {
//                        toUserId = noticeToId;
//                    } else if (challengeInvitorId.equals(noticeToId)) {
//                        toUserId = noticeFromId;
//                    } else {
//                        continue;
//                    }
//                    if (toUserId == null) {
//                        continue;
//                    }
//
//                    if (!cacheUtil.canTemplateMsgForChallengeInvite(toUserId,challengeId)){
//                        this.exceptionLog("challgen:" + challengeId + " for user:" + toUserId + " has been sent!");
//                        continue;
//                    }
//
//                    Long fromUserId = challengeInvitorId;
//
//                    UserInfoBean fromUser = userService.getUserInfo(fromUserId);
//                    UserInfoBean toUser = userService.getUserInfo(toUserId);
//                    UserForm userForm = userService.getOldestUserFormById(toUserId);
//                    if (fromUser != null && toUser != null && userForm != null){
//                        this.exceptionLog("empty userform/touser for " + toUserId + " or empty fromuser for " + fromUserId);
//                        Map<String, Object> map = new HashMap<String, Object>();
//
//                        boolean cmtPoint = noticeService.checkNotRead(1,toUserId);
//                        boolean stealPoint = noticeService.checkNotRead(0,toUserId);
//                        boolean isRedPoint = cmtPoint || stealPoint;
//                        // 根据 Challenge 获取比赛名称和截止时间
//                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//                        Date time = challengeJson.getDate("endDate");
//                        String endTimeStr = sdf.format(time);
//                        map.put("endTime", endTimeStr);
//                        map.put("challengeName", "运动步行挑战赛");
//                        map.put("formId", userForm.getFormId());
//                        map.put("templateMsgType",5);
//                        StringBuilder sbPage = new StringBuilder("pages/notification/notification?challengePoint=false&isRedPoint=");
//                        sbPage.append(isRedPoint);
//                        sbPage.append("&commentPoint=");
//                        sbPage.append(cmtPoint);
//                        sbPage.append("&stealGoldPoint=");
//                        sbPage.append(stealPoint);
//                        sbPage.append("&focus=2");
//                        String pageUrl = sbPage.toString();
//                        this.exceptionLog("params:" + map.toString());
//                        this.exceptionLog("page:" + pageUrl);
//                        // 调用发送模板 传参发送消息
//                        // 5 表示CHALLENGE_CREATED 比赛邀请通知
//                        ResponseV2 resp = wxService.sendTemplateMsg(JSONObject.toJSONString(fromUser), JSONObject.toJSONString(toUser), pageUrl, map);
//                        if(resp.getCode() == HttpStatus.OK.value()) {
//                            userService.deleteUsedForm(userForm.getId());
//                            cacheUtil.recordTemplateMsgForChallengeInvite(toUserId,challengeId);
//                        }else {
//                            this.exceptionLog(resp.getMsg());
//                        }
//                    }
//
//                } catch (Exception e) {
//                    this.exceptionLog("exception:" + e.getLocalizedMessage());
//                }
//            }
//            Integer totalPages = notices.getTotalPages();
//            if (totalPages < ++page) break;
//        }
//    }
//
//    private void exceptionLog(String msg) {
//        exceptionUtil.logError(this.getClass(), "sendChallengeInviteTmpMsg", msg);
//    }
//
//    public static void main(String[] args) {
//        System.out.println(DateUtil.getUnixTime());
//        System.out.println(new Date(1517974503*1000L).toString());
//    }
}
